// 快速傅里叶变换 FFT 算法 多项式乘法
// 测试链接 ：https://www.luogu.com.cn/problem/P3803
// 相关帖子 ：https://www.cnblogs.com/dx123/p/17003464.html
// 相关帖子 ：https://en.oi-wiki.org/math/poly/fft/
// 提交以下的code，可以直接通过

#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int MAXN = 4e6;
const double PI = acos(-1);
struct complex
{
    double x, y; // 实部，虚部
    // 复数加法
    complex operator+(const complex& t) const
    {
        return {x + t.x, y + t.y};
    }
    // 复数减法
    complex operator-(const complex& t) const
    {
        return {x - t.x, y - t.y};
    }
    // 复数乘法
    complex operator*(const complex& t) const
    {
        return {x * t.x - y * t.y, x * t.y + y * t.x};
    }
}A[MAXN], B[MAXN];
int R[MAXN];

void change(complex A[], int n)
{
    // 位逆序变换
    for(int i = 0; i < n; ++i)
    {
        R[i] = R[i / 2] / 2 + ((i & 1) ? n / 2 : 0);
    }
    for(int i = 0; i < n; ++i)
    {
        if(i < R[i]) swap(A[i], A[R[i]]);
    }
}

// 迭代版
void FFT(complex A[], int n, int op)
{
    change(A, n);
    for(int m = 2; m <= n; m <<= 1) // 枚举块宽
    {
        complex w1({cos(2 * PI / m), op * sin(2 * PI / m)});
        for(int i = 0; i < n; i += m) // 枚举块数
        {
            complex wk({1, 0});
            for(int j = 0; j < m / 2; ++j) // 枚举半块
            {
                complex x = A[i + j], y = A[i + j + m / 2] * wk;
                A[i + j] = x + y; A[i + j + m / 2] = x - y;
                wk = wk * w1;
            }
        }
    }
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 0; i <= n; ++i) scanf("%lf", &A[i].x);
    for(int i = 0; i <= m; ++i) scanf("%lf", &B[i].x);
    for(m = n + m, n = 1; n <= m; n <<= 1); // 求 n
    FFT(A, n, 1); FFT(B, n, 1); // 求点值
    for(int i = 0; i < n; ++i) A[i] = A[i] * B[i]; // 乘积
    FFT(A, n, -1); // 求系数
    for(int i = 0; i <= m; ++i) printf("%d ", (int)(A[i].x / n + 0.5));

    return 0;
}